CSRF、XSS & CORS
CSRF、XSS、CORS のセキュリティ用語の説明
はじめに
これらの用語に馴染みがないなら、あなただけではありません。数週間前、プロジェクトでこれらを考慮する必要があり、「これは何だ?」と自問する機会がありました。その結果、多くの疑問が生まれ、それをまとめてこれらのセキュリティ用語のガイドを作成しました。
まず、各用語の定義と仕組みを説明します。
CSRF
CSRFは Cross Site Request Forgery(クロスサイトリクエストフォージェリ) の略で、XSRFとも呼ばれます。これは、ブラウザに脆弱なウェブサイトへのリクエストを送信させる攻撃です。
例として、誰かがあなたのブラウザからメールにアクセスし、受信トレイを別のメールアドレスにリダイレクトする場合があります(個人情報を含むメッセージが漏れる可能性があります)。

CSRF攻撃の例
画像では攻撃者の手順を示しています:
- まず、銀行からお金を取得するための 悪意のあるHTMLコード を作成します。
- 次に攻撃者は 訪問者のブラウザにコードを注入 します(訪問者が対象のウェブサイトにログインしていることを前提とします)。
- 被害者は 銀行サイトでお金を入金する操作 を行います。
- 銀行はユーザーを確認 し(お金が攻撃者の口座に入金されていることには気付かず)、リクエストを受け入れます。
この種の攻撃を防ぐための推奨事項:
- 使用していないサービスからは ログアウト する
- シークレットモード を使用する
- 異なるブラウザ を一般用途と重要作業で使い分ける
CORS
CORSは Cross Origin Resource Sharing(クロスオリジンリソース共有) の略です。外部ドメインからコンテンツを読み込むことを禁止する セキュリティポリシー があり、すべて同一サーバー上にある必要があります。適切に制御しないと セキュリティの脆弱性 となる可能性があります。
仕組みは以下の通りです:クライアントがサーバーAから情報を取得すると、サーバーAはどのサーバーがデータにアクセス可能かを指定する HTTPヘッダー を返します。問題なく動作するのは GET, HEAD, POST のみで、それ以外の PUT, PATCH, DELETE はCORSと衝突する可能性があり確認が必要です。
さらに、上記のHTTPヘッダーは通常自動で設定されますが、手動で設定できるものは以下の4つです:Accept, Accept-Language, Content-Language, Content-Type。

CORSの例
画像はCORSの動作を示しています:クライアントが自分のサーバーから .CSS ファイルを取得する場合(同一ドメイン)は問題なく取得できます。しかし、別のドメインから .WOFF フォントを取得する場合、CORSによりアクセスが許可されます。理由としては、リクエスト元のドメインが指定されており、リクエストヘッダーで任意のオリジンへのアクセスが許可され、さらにGETリクエストでCORSの制約に抵触しないためです。
もしGETの代わりにPUTでリクエストした場合は衝突が発生し、外部ドメインへ情報を送信できません。
XSS
ブラウザからセッションをハイジャックされ、個人情報が盗まれることを聞いたことがあるかもしれません。これが Cross Site Scripting(XSS) です。SQLインジェクションに似ていますが、XSSはクライアント側を対象とします。
通常、悪意のあるコードはウェブサイトの検索バーやフォームに注入されますが、XSS攻撃には2種類 あります:永続型と反射型。
永続型XSS攻撃 は、注入されたコードがウェブサイトに残る場合です(いたずらの署名のようなものです)。
反射型XSS攻撃 は、ユーザーが気付かないうちにコードが実行されます。例えば、リンク付きのメールを開くと、ログイン済みのページで裏で悪意のあるコードが実行され、クッキーやID情報が盗まれます。
主な違いは、反射型XSSは サーバーに何も残さない 点です。
ウェブサイトの脆弱性を確認する方法
検索バーやフォームに以下のスクリプトを入力してポップアップが表示されれば、そのサイトは脆弱です:
- 常識を使い、URLを確認 する。少しでも怪しい場合はアクセスしない。
- NoScriptなどのブラウザ拡張 を使い、不要な操作をブロックする。
- プラグインやブラウザを最新に保つ。
XSSとCSRFの違い
攻撃者があなたを騙してお金を奪おうとする場合:
- CSRF はあなたが意図しない リクエストを実行させようとする 例(リンクをクリックしてパスワードを変更させるなど)。
- XSS はブラウザで 意図せずコマンドを実行させる 例。